package cn.java.lambda.test3;

import java.util.Arrays;
import java.util.function.Predicate;

/**
 * 测试Predicate<T>函数式接口
 * @author 攀博课堂(www.pbteach.com)
 * @version 1.0
 **/
public class TestPredicate {

    //一个整型数组
    static int[] datas = {1,2,3,4,5,6,7};

    public static void main(String[] args) {
        //定义Lambda表达式，实现奇偶判断
        Predicate<Integer> filter1 = n ->{
            if(n % 2 ==0){
                return true;
            }else{
                return false;
            }
        };
        System.out.println("========奇偶判断=======");
        int[] datas1 = doFilter(filter1, datas);
        for (int i = 0; i < datas1.length; i++) {
            System.out.println(datas1[i]);
        }
        System.out.println("========大于5的数=======");
        //定义一个过虑器
        Predicate<Integer> filter2 = n -> n>5;
        int[] datas2 = doFilter(filter2, datas1);
        for (int i = 0; i < datas2.length; i++) {

            System.out.println(datas2[i]);
        }
    }


    /**
     * 对数据进行过虑
     * @param filter 过虑器
     * @param datas 待过虑的数组
     * @return 保留数据的数组
     */
    public static int[] doFilter(Predicate<Integer> filter,int[] datas){

        //新建一个数组，用于存储保留数据
        int[] result = new int[datas.length];
        //保留数组的下标
        int n=0;
        for (int i = 0; i < datas.length; i++) {
            if(filter.test(datas[i])){
                //保留数据
                result[n++] = datas[i];
            }
        }

        //最后只返回一个正好包含保留数据容量的数组
        //参数1：原始数组，参数2：需要保留数组长度
        int[] newResult = Arrays.copyOf(result, n);
        return newResult;
    }

}
